package com.inspur.cmis.controller;

import java.io.InputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.inspur.cmis.pojo.User;
import com.inspur.cmis.service.UserService;
import com.inspur.cmis.util.ImportExcelUtil;

/**
 * 用户管理模块
 * @author ji_zhh
 *
 */
@Controller
public class UserController {
	
	@Autowired
	private UserService userService;
	
	/**
	 * 检索用户信息
	 * @return
	 */
	@RequestMapping("/getUserInfoList")   
	//使用@RequestParam完成页码传值，点击左侧菜单树，按照默认条件检索，则使用1，默认检索第一页
	public String getUserInfoList(Model model,String memId,String cname,@RequestParam(value="pn",defaultValue="1") Integer pn){
		//存储检索条件
		Map<String,String> map=new HashMap<String,String>();
		map.put("memId", memId);
		map.put("cname", cname);
		
		//进行分页
		PageHelper.startPage(pn, 5);//设置分页参数，第一个参数：当前页码,一页最多显示的记录条数
	    List<User> userList=userService.getUserInfoList(map);//检索所有符合条件的记录
	    PageInfo<User> pageInfo=new PageInfo<User>(userList,userList.size());//进行分页，封装list到 PageInfo对象中自动分页，分页后的数据暂存在pageInfo中，第一个参数：要分页的数据（检索回的数据），第二个参数：总记录条数
	    
	    
	    //model.addAttribute("userList",userList);
	    model.addAttribute("pageInfo",pageInfo);//分页的信息暂存
	    model.addAttribute("memId",memId);//完成检索界面上值的回显
	    model.addAttribute("cname",cname);//完成检索界面上值的回显
	    //视图名
		return "user/userInfo.jsp";
	}
	
	//批量删除
	@RequestMapping("/deleteUsers")
	public String deleteUsers(String ids){
		String userIds[]=ids.split(",");//将ids分割为string数组
		int user_Ids[]=new int[userIds.length];//将string数组数据改为int数组数据
		for(int i=0;i<userIds.length;i++){
			user_Ids[i]=Integer.parseInt(userIds[i]);
		}
		userService.deleteUsers(user_Ids);
		return "redirect:getUserInfoList";
	}
	
	/**
	 * 添加用户
	 * 
	 */
	@RequestMapping("/userInfoAdd")
	public String userInfoAdd(User user,Model model){
		user.setMemPass("123456");//新用户密码为123456
		user.setIsenable("T");
	
		//添加用户
		userService.addUser(user);
		
		model.addAttribute("member", user);//值的回显。因登陆验证后，记录当前用户信息是用session中存user，这里仅仅是添加界面上值的回显用member。不用user，防止冲突
		model.addAttribute("flag", "1");//添加成功的标志
		model.addAttribute("success","保存成功");
		//迁移到本界面上完成值的回显，并显示添加成功
		return "user/userInfoAdd.jsp";
	}
	
	/**
	 * 添加时检查姓名是否已经存在
	 * @param cname
	 */
	/*
	 * @ResponseBody的作用其实是将java对象转为json格式的数据。
	   @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后，写入到response对象的body区，通常用来返回JSON数据或者是XML数据。
           注意：在使用此注解之后不会再走视图处理器，而是直接将数据写入到输入流中，他的效果等同于通过response对象输出指定格式的数据。
	 */
	@RequestMapping("/checkUser")
	@ResponseBody
    public Map checkUser(String username){
    	System.out.println("username=="+username);
    	List<User> selectUsers=userService.getUserByCname(username);//查询该用户名重名的记录
    	Map map = new HashMap();
    	//已经存在
    	if(selectUsers!=null&&selectUsers.size()>=1){
    		map.put("msg","姓名已经存在");
    	}
    	return map;
    } 
	
	/**
	 * 查找修改前用户信息
	 */
	@RequestMapping("/userInitUpdate")
	public String userInitUpdate(Integer []ids,Model model){
		System.out.println(ids[0]);
	    User member=userService.getUserById(ids[0]);
	    model.addAttribute("member",member);//显示修改前的信息
	    
		return "user/userInfoUpdate.jsp";
	}

	/**
	 * 修改用戶信息
	 */
	@RequestMapping("/userInfoUpdate")
	public String userInfoUpdate(User user){
		//修改用户信息
		userService.updateUserInfo(user);
		return "redirect:getUserInfoList";
	}
	
	/**
	 * 用户信息的批量导入
	 * @param request
	 * @param response
	 * @throws Exception
	 */
	@RequestMapping("/uploadExcel")
	public void uploadExcel(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

		InputStream in = null;
		List<List<Object>> listob = null;
		MultipartFile file = multipartRequest.getFile("upfile");

		if (file.isEmpty()) {
			throw new Exception("文件不存在！");
		}
		in = file.getInputStream();
		listob = new ImportExcelUtil().getBankListByExcel(in,
				file.getOriginalFilename());
		in.close();
		
		List<User> userList = new ArrayList<User>();
		Date today = new Date();
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		String time = format.format(today);
		// 该处可调用service相应方法进行数据保存到数据库中，现只对数据输出
		for (int i = 0; i < listob.size(); i++) {
			List<Object> lo = listob.get(i);
			User user = new User();
			
			//如果后面没有行记录了则跳出循环
			if(lo.get(0).equals("")){
				break;
			}
			user.setMemId(Integer.parseInt(String.valueOf(lo.get(0))));// 用户信息编号
			user.setCname(String.valueOf(lo.get(1)));// 姓名
			user.setMemPass(String.valueOf(lo.get(2)));//密码
			user.setMemSex(String.valueOf(lo.get(3)));// 性别
			user.setMemBorn(String.valueOf(lo.get(4)));// 出生日期
			user.setMemMail(String.valueOf(lo.get(5)));// 邮箱
			user.setIsenable(String.valueOf(lo.get(6)));// 是否可用
			user.setRoleid(String.valueOf(lo.get(7)));// 用户角色
			user.setRegisterTime(time);//注册日期
			//user.setLastTime(time);//最后登录日期
			user.setMemQuestion("6位吉祥数字");
			user.setMemAnswer("666666");
		    userList.add(user);
		}
		//批量导入
		userService.importUser(userList);
		PrintWriter out = null;
		response.setCharacterEncoding("utf-8"); // 防止ajax接受到的中文信息乱码
		out = response.getWriter();
		out.print("文件导入成功！");
		out.flush();
		out.close();
	}
}
